package com.luxsoft.sw3.contabilidad.ui;

import java.text.DateFormat;
import java.text.MessageFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.util.Assert;

import ca.odell.glazedlists.BasicEventList;
import ca.odell.glazedlists.GlazedLists;
import ca.odell.glazedlists.UniqueList;

import com.luxsoft.siipap.cxc.model.Aplicacion;
import com.luxsoft.siipap.cxc.model.AplicacionDePago;
import com.luxsoft.siipap.cxc.model.Pago;
import com.luxsoft.siipap.cxc.model.PagoConCheque;
import com.luxsoft.siipap.cxc.model.PagoConDeposito;
import com.luxsoft.siipap.cxc.model.PagoConEfectivo;
import com.luxsoft.siipap.cxc.model.PagoConTarjeta;
import com.luxsoft.siipap.cxc.model.PagoDeDiferencias;
import com.luxsoft.siipap.model.CantidadMonetaria;
import com.luxsoft.siipap.model.Sucursal;
import com.luxsoft.siipap.model.contabilidad.AsientoContable;
import com.luxsoft.siipap.model.contabilidad.Poliza;
import com.luxsoft.siipap.service.ServiceLocator2;
import com.luxsoft.siipap.util.MonedasUtils;
import com.luxsoft.siipap.ventas.model.Venta;
import com.luxsoft.sw3.cfd.model.ComprobanteFiscal;


/**
 * Genera la poliza de ventas tipo mostrador
 * 
 *  Tipo de informacion:
 *  		
 *  	Bancos (Pagos registrados)
 *  		Efectivo
 *  		Cheque
 *  		Tarjeta
 *  			Credito
 *  				Amex
 *  				Otros
 *  			Debito
 *  		Depositos
 *  
 *  	Comisiones Bancarias y su IVA
 *  
 *  		Por pagos con Tarjeta de Credito
 *  		Por pagos con Tarjeta de debito
 *  	
 *  	Ventas
 *  		Total de ventas motrador por dia por sucursal
 *  		Iva por las ventas anteriores
 *  	
 *  	IETU Cargo y abono del total de los pagos que califican 
 *  
 *    	Registros de ventas mostrador con saldo menor a 10 pesos (Otros gastos)
 *    
 *    	Registros de pagos con disponibles menor a 10 pesos (Otros productos)
 *  		
 *  	
 *  
 *  CUENTA		CONCEPTO				DEBE	HABER
			
102-EFEC-000	SCOTTIA					X	
102-CHEQ-000	SCOTTIA					X	
102-TDEB-000	BANAMEX					X	
102-TCRE-000	BANAMEX					X	
102-TAMX-000	BANAMEX-AMX				X	
102-DEPO-000	VARIOS	X	
6SUC-0020-000	COMISIONES BANCARIAS SucX	
117-0005-003	I.V.A. EN GASTOS		X	
			
			
401-0001-SUC	MOSTRADOR						X
206-0003-001	I.V.A. EN VENTAS				X


902-0001-000	ACUMULABLE IETU MOS		X	
903-0001-000	ACUMULABLE IETU MOS				X

704-0001-000	OTROS GASTOS MOS		X	
702-0001-000	OTROS INGRESOS MOS				X


 * 
 * @author Ruben Cancino Ramos
 *
 */
public class PolizaDeVentasyCobranzaMostradorController_bak {
	
	protected Logger logger=Logger.getLogger(getClass());
	
	private DateFormat df=new SimpleDateFormat("dd-MM-yy");
	
	/**
	 * Genera las polizas de ventas mostrador para la fecha indicada
	 * una por cada sucursal
	 * 
	 * @param fecha
	 * @return
	 */
	public List<Poliza> generarPoliza(final Date fecha ){		
		List<Poliza> res=new ArrayList<Poliza>();
		List<Sucursal> sucursales=ServiceLocator2
				.getLookupManager()
				.getSucursalesOperativas();
		
		for(Sucursal s:sucursales){
			try {
				Poliza p=generar(fecha, s);
				p.depurar();
				p.ordenNatural();
				res.add(p);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return res;
	}
	
	private Poliza generar(final Date dia,final Sucursal suc){
		
		final Poliza pol=new Poliza();
		//pol.setConcepto("Ventas de Mostrador del "+df.format(dia)+" Suc. "+pol.setSucursalNombre(suc.getNombre()));
		pol.setConcepto("Ventas de Mostrador del "+df.format(dia)+" Suc. "+suc.getNombre());
		pol.setFecha(dia);
		pol.setFolio(0);
		pol.setTipo("Ig");
		pol.setSucursalId(suc.getClaveContable());
		pol.setSucursalNombre(suc.getNombre());
		registrarBancos(pol,suc);
		registrarComisiones(pol, suc);
		registrarVentas(pol,suc);
		registrarVentasCamioneta(pol, suc);
		registrarIETU(pol, suc);		
		registrarOtrosIngresosGastos(pol, suc);
		return pol;
		
	}
	
	private Set<Pago> pagos;
	private UniqueList<PagoConTarjeta> pagosConTarjeta;
	
	private void registrarBancos(final Poliza poliza,final  Sucursal suc){
		pagos=new HashSet<Pago>();
		Date fecha=poliza.getFecha();
		String hql="from Aplicacion a where a.fecha=? and a.cargo.sucursal.id=? " +
				" and a.cargo.origen=\'MOS\'";
		List<AplicacionDePago> aplicaciones=ServiceLocator2
			.getHibernateTemplate().find(hql,new Object[]{fecha,suc.getId()});
		for(Aplicacion ap:aplicaciones){
			if(ap.getAbono() instanceof Pago)
				pagos.add((Pago)ap.getAbono());
		}
		
		
		CantidadMonetaria totalEfectivo=CantidadMonetaria.pesos(0);
		CantidadMonetaria totalCheque=CantidadMonetaria.pesos(0);
		for(Pago p:pagos){
			if(p instanceof PagoConEfectivo){
				totalEfectivo=totalEfectivo.add(p.getTotalCM());				
			}else if(p instanceof PagoConCheque){
				totalCheque=totalCheque.add(p.getTotalCM());
			}
		}
		
		String concepto="Vta MOS "+df.format(poliza.getFecha())+suc.getNombre();
		concepto=StringUtils.substring(concepto, 0, 27);
		
		//Efectivo
		AsientoContable asientoEfectivo=new AsientoContable();
		asientoEfectivo.setCuenta("102-0001-000");
		asientoEfectivo.setConcepto(concepto);
		asientoEfectivo.setAgrupador("A");
		asientoEfectivo.setDebe(totalEfectivo);
		asientoEfectivo.setDescripcion("Efectivo");
		asientoEfectivo.setDescripcion2("");
		asientoEfectivo.setDescripcion3("");
		asientoEfectivo.setSucursal(suc.getNombre());
		asientoEfectivo.setTipo("D");
		asientoEfectivo.setOrden(1);
		poliza.agregarAsiento(asientoEfectivo);
		
		//Cheque
		AsientoContable asientoCheque=new AsientoContable();
		asientoCheque.setCuenta("102-0001-000");
		asientoCheque.setConcepto(concepto);
		asientoCheque.setAgrupador("A");
		asientoCheque.setDebe(totalCheque);
		asientoCheque.setDescripcion("Cheque");
		asientoCheque.setDescripcion2("");
		asientoCheque.setDescripcion3("");
		asientoCheque.setSucursal(suc.getNombre());
		asientoCheque.setTipo("D");
		asientoCheque.setOrden(2);
		poliza.agregarAsiento(asientoCheque);
		
		//Depositos
		for(Pago p:pagos){
			if(p instanceof PagoConDeposito){
				PagoConDeposito deposito=(PagoConDeposito)p;
				if(deposito.getCuenta()!=null){
					AsientoContable asientoDeposito=new AsientoContable();				
					asientoDeposito.setCuenta(deposito.getCuenta().getCuentaContable());
					asientoDeposito.setConcepto(concepto);
					asientoDeposito.setAgrupador("A");
					asientoDeposito.setDebe(deposito.getTotalCM());
					asientoDeposito.setDescripcion("Deposito");
					asientoDeposito.setDescripcion2("");
					asientoDeposito.setDescripcion3("");
					asientoDeposito.setSucursal(suc.getNombre());
					asientoDeposito.setTipo("D");
					poliza.agregarAsiento(asientoDeposito);
				}
			}
		}
		
		//Tarjetas
		
		List<Aplicacion> aplicacionesTarjeta=ServiceLocator2
			.getHibernateTemplate().find(
					"from AplicacionDePago a where a.fecha=? and a.cargo.sucursal.id=?  " +
					" and a.cargo.origen!=\'CRE\'"
					,new Object[]{fecha,suc.getId()});
		
		pagosConTarjeta=new UniqueList<PagoConTarjeta>(new BasicEventList<PagoConTarjeta>(),GlazedLists.beanPropertyComparator(PagoConTarjeta.class, "id"));
		for(Aplicacion ap:aplicacionesTarjeta){
			if(ap.getAbono() instanceof PagoConTarjeta){
				pagosConTarjeta.add((PagoConTarjeta)ap.getAbono());
			}
		}
		
		CantidadMonetaria banamexTarjeta=CantidadMonetaria.pesos(0);
		importeBrutoAmex=CantidadMonetaria.pesos(0);
		for(PagoConTarjeta pt:pagosConTarjeta){
			Assert.notNull(pt.getTarjeta(),"Pago con tarjeta sin tarjeta : "+pt.getTotal()+ " Aut: "+pt.getAutorizacionBancaria()+ " Id:"+pt.getId());
			if(StringUtils.containsIgnoreCase(pt.getTarjeta().getNombre(), "AMERICAN")){
				importeBrutoAmex=importeBrutoAmex.add(pt.getTotalCM());
			}else
				banamexTarjeta=banamexTarjeta.add(pt.getTotalCM());
		}
		
		AsientoContable cargoABancosBanamex=new AsientoContable();
		cargoABancosBanamex.setCuenta("102-0002-000");
		concepto="Vta MOS "+df.format(poliza.getFecha())+" Tar";
		concepto=StringUtils.substring(concepto, 0, 27);
		cargoABancosBanamex.setConcepto(concepto);
		cargoABancosBanamex.setDebe(banamexTarjeta);
		cargoABancosBanamex.setSucursal(suc.getNombre());
		cargoABancosBanamex.setAgrupador("A");
		cargoABancosBanamex.setTipo("D");
		cargoABancosBanamex.setOrden(16);
		poliza.agregarAsiento(cargoABancosBanamex);
		
		AsientoContable cargoABancosAmex=new AsientoContable();
		cargoABancosAmex.setCuenta("109-A007-000");
		concepto="American Express Tarjeta";
		concepto=StringUtils.substring(concepto, 0, 27);
		cargoABancosAmex.setConcepto(concepto);
		cargoABancosAmex.setDebe(importeBrutoAmex);
		cargoABancosAmex.setSucursal(suc.getNombre());
		cargoABancosAmex.setAgrupador("A");
		cargoABancosAmex.setTipo("D");
		cargoABancosAmex.setOrden(22);
		poliza.agregarAsiento(cargoABancosAmex);
		
		// Importe bruto AMEX
		if(importeBrutoAmex.amount().doubleValue()>0){
			AsientoContable asientoComplemento=new AsientoContable();
			asientoComplemento.setCuenta("109-A007-000");
			concepto="American Express Tarjeta";							
			concepto=StringUtils.substring(concepto, 0, 27);
			asientoComplemento.setConcepto(concepto);		
			asientoComplemento.setHaber(this.importeBrutoAmex);
			asientoComplemento.setDescripcion("");
			asientoComplemento.setSucursal(suc.getNombre());
			asientoComplemento.setAgrupador("B");
			asientoComplemento.setTipo("H");
			asientoComplemento.setOrden(23);
			poliza.agregarAsiento(asientoComplemento);
		}
			
	}
	
	private CantidadMonetaria importeBrutoAmex=CantidadMonetaria.pesos(0);
	
	private void registrarComisiones(final Poliza poliza,Sucursal suc){
		
		CantidadMonetaria comisionDebito=CantidadMonetaria.pesos(0);
		CantidadMonetaria ivaComisionDebito=CantidadMonetaria.pesos(0);
		
		CantidadMonetaria comisionCredito=CantidadMonetaria.pesos(0);
		CantidadMonetaria ivaComisionCredito=CantidadMonetaria.pesos(0);
		
		CantidadMonetaria comisionCreditoAmex=CantidadMonetaria.pesos(0);
		CantidadMonetaria ivaComisionCreditoAmex=CantidadMonetaria.pesos(0);
		
		for(PagoConTarjeta pt:pagosConTarjeta){
			if(pt.getTarjeta()==null){
				System.out.println("Pago con tarjeta sin tarjeta asignada probablemente realizado en siipa dbf");
				continue;
			}
			if(pt.getTarjeta().isDebito()){
				double comision=pt.getTarjeta().getComisionBancaria();
				CantidadMonetaria monto=pt.getTotalCM().multiply(comision/100);
				comisionDebito=comisionDebito.add(monto);
				ivaComisionDebito=ivaComisionDebito.add(MonedasUtils.calcularImpuesto(monto));
			}else{
				if(StringUtils.containsIgnoreCase(pt.getTarjeta().getNombre(), "AMERICAN")){
					double comision=pt.getTarjeta().getComisionBancaria();
					CantidadMonetaria monto=pt.getTotalCM().multiply(comision/100);
					comisionCreditoAmex=comisionCreditoAmex.add(monto);
					ivaComisionCreditoAmex=ivaComisionCreditoAmex.add(MonedasUtils.calcularImpuesto(monto));
				}else{
					double comision=pt.getTarjeta().getComisionBancaria();
					CantidadMonetaria monto=pt.getTotalCM().multiply(comision/100);
					comisionCredito=comisionCredito.add(monto);
					ivaComisionCredito=ivaComisionCredito.add(MonedasUtils.calcularImpuesto(monto));
				}
			}			
		}
		
		/***************GASTOS EN COMISIONES BANCARIAS *******************/
		
		String concepto="COMISIONES BANCARIAS "+suc.getNombre();
		concepto=StringUtils.substring(concepto, 0, 27);
		
		/*Comisiones de tarjetas*/
		//Banamex
		AsientoContable cargoComisionGastoBmx=new AsientoContable();
		String ct=String.valueOf(suc.getClaveContable());
		String cuenta="6"+StringUtils.leftPad(ct, 2,'0')+"-0020-000";
		cargoComisionGastoBmx.setCuenta(cuenta);
		concepto="COMISIONES BANCARIAS BMX"+suc.getNombre();
		concepto=StringUtils.substring(concepto, 0, 27);
		cargoComisionGastoBmx.setConcepto(concepto);		
		cargoComisionGastoBmx.setDebe(comisionDebito.add(comisionCredito));
		cargoComisionGastoBmx.setDescripcion2("GASTO");
		cargoComisionGastoBmx.setSucursal(suc.getNombre());
		cargoComisionGastoBmx.setAgrupador("B");
		cargoComisionGastoBmx.setTipo("D");
		cargoComisionGastoBmx.setOrden(12);
		poliza.agregarAsiento(cargoComisionGastoBmx);
		
		AsientoContable cargoIvaGastoComisionBmx=new AsientoContable();
		cuenta="117-0005-003";
		cargoIvaGastoComisionBmx.setCuenta(cuenta);
		concepto="IVA EN GASTOS BMX";
		concepto=StringUtils.substring(concepto, 0, 27);
		cargoIvaGastoComisionBmx.setConcepto(concepto);		
		cargoIvaGastoComisionBmx.setDebe(ivaComisionDebito.add(ivaComisionCredito));
		cargoIvaGastoComisionBmx.setDescripcion2("GASTO");
		cargoIvaGastoComisionBmx.setSucursal(suc.getNombre());
		cargoIvaGastoComisionBmx.setAgrupador("B");
		cargoIvaGastoComisionBmx.setTipo("D");
		cargoIvaGastoComisionBmx.setOrden(13);
		poliza.agregarAsiento(cargoIvaGastoComisionBmx);
		
		//Amex
		AsientoContable cargoComisionGastoAmex=new AsientoContable();
		cuenta="6"+StringUtils.leftPad(ct, 2,'0')+"-0020-000";
		cargoComisionGastoAmex.setCuenta(cuenta);		
		concepto="COMISIONES BANCARIAS AMEX"+suc.getNombre();
		cargoComisionGastoAmex.setConcepto(concepto);		
		cargoComisionGastoAmex.setDebe(comisionCreditoAmex);
		cargoComisionGastoAmex.setDescripcion2("GASTO");
		cargoComisionGastoAmex.setSucursal(suc.getNombre());
		cargoComisionGastoAmex.setAgrupador("B");
		cargoComisionGastoAmex.setTipo("D");
		cargoComisionGastoAmex.setOrden(12);
		poliza.agregarAsiento(cargoComisionGastoAmex);
		
		AsientoContable cargoIvaGastoComisionAmex=new AsientoContable();
		cuenta="117-0005-003";
		cargoIvaGastoComisionAmex.setCuenta(cuenta);
		concepto="IVA EN GASTOS AMEX";
		concepto=StringUtils.substring(concepto, 0, 27);
		cargoIvaGastoComisionAmex.setConcepto(concepto);		
		cargoIvaGastoComisionAmex.setDebe(ivaComisionCreditoAmex);
		cargoIvaGastoComisionAmex.setDescripcion2("GASTO");
		cargoIvaGastoComisionAmex.setSucursal(suc.getNombre());
		cargoIvaGastoComisionAmex.setAgrupador("B");
		cargoIvaGastoComisionAmex.setTipo("D");
		cargoIvaGastoComisionAmex.setOrden(13);
		poliza.agregarAsiento(cargoIvaGastoComisionAmex);
		
		/***** IETU DEL GASTO (COSTO DE LA COMISION) ****/
		
		CantidadMonetaria ietuGastos=CantidadMonetaria.pesos(0);
		ietuGastos=comisionDebito.add(comisionCredito).add(comisionCreditoAmex);
		
		AsientoContable ietuDebe=new AsientoContable();
		ietuDebe.setCuenta("900-0002-000");
		ietuDebe.setConcepto("IETU DEDUCIBLE GASTOS");		
		ietuDebe.setDebe(ietuGastos);
		ietuDebe.setSucursal(suc.getNombre());
		ietuDebe.setAgrupador("X");
		ietuDebe.setTipo("D");
		ietuDebe.setOrden(14);
		poliza.agregarAsiento(ietuDebe);
		
		
		AsientoContable ietuHaber=new AsientoContable();
		ietuHaber.setCuenta("901-0002-000");
		ietuHaber.setConcepto("DEDUCIBLE IETU GASTOS");		
		ietuHaber.setHaber(ietuGastos);
		ietuHaber.setSucursal(suc.getNombre());
		ietuHaber.setAgrupador("X");
		ietuHaber.setTipo("H");
		ietuHaber.setOrden(15);
		poliza.agregarAsiento(ietuHaber);
		
		
		
		/*************************** COMISIONES BANCARIAS ***************************/
		
		String pattern="VTA MOS @TIPO {0,date,short} {1}";
		concepto=MessageFormat.format(pattern, poliza.getFecha(),suc.getNombre());
		concepto=StringUtils.substring(concepto, 0, 27);
		
		AsientoContable asientoComisionDebitoAbono=new AsientoContable();
		cuenta="102-0002-000";
		asientoComisionDebitoAbono.setCuenta(cuenta);
		asientoComisionDebitoAbono.setConcepto(concepto.replaceAll("@TIPO", "DEB"));		
		asientoComisionDebitoAbono.setHaber(comisionDebito);
		asientoComisionDebitoAbono.setDescripcion("");
		asientoComisionDebitoAbono.setDescripcion2("DEBITO");
		asientoComisionDebitoAbono.setSucursal(suc.getNombre());
		asientoComisionDebitoAbono.setAgrupador("B");
		asientoComisionDebitoAbono.setTipo("H");
		asientoComisionDebitoAbono.setOrden(17);
		poliza.agregarAsiento(asientoComisionDebitoAbono);
		
		
		
		AsientoContable acomisionCreditoAbono=new AsientoContable();
		cuenta="102-0002-000";
		acomisionCreditoAbono.setCuenta(cuenta);				
		acomisionCreditoAbono.setConcepto(concepto.replaceAll("@TIPO", "CRE"));		
		acomisionCreditoAbono.setHaber(comisionCredito);
		acomisionCreditoAbono.setDescripcion("");
		acomisionCreditoAbono.setDescripcion2("CREDITO");
		acomisionCreditoAbono.setSucursal(suc.getNombre());
		acomisionCreditoAbono.setAgrupador("B");
		acomisionCreditoAbono.setTipo("H");
		acomisionCreditoAbono.setOrden(19);
		poliza.agregarAsiento(acomisionCreditoAbono);
		
		CantidadMonetaria comisionTotalAmex=comisionCreditoAmex.add(ivaComisionCreditoAmex);
		
		AsientoContable acomisionCreditoAmexAbono=new AsientoContable();
		acomisionCreditoAmexAbono.setCuenta(cuenta);
		acomisionCreditoAmexAbono.setConcepto("INGRESO NETO CRE AMEX");;		
		acomisionCreditoAmexAbono.setDebe(this.importeBrutoAmex.subtract(comisionTotalAmex));
		acomisionCreditoAmexAbono.setDescripcion("");
		acomisionCreditoAmexAbono.setDescripcion2("CREDITO AMEX");
		acomisionCreditoAmexAbono.setSucursal(suc.getNombre());
		acomisionCreditoAmexAbono.setAgrupador("B");
		acomisionCreditoAmexAbono.setTipo("D");
		acomisionCreditoAmexAbono.setOrden(24);
		poliza.agregarAsiento(acomisionCreditoAmexAbono);
		
		/*************************** IVA DE COMISIONES BANCARIAS ***************************/
		
		pattern="VTA MOS IVA @TIPO {0,date,short} {1}";
		concepto=MessageFormat.format(pattern, poliza.getFecha(),suc.getNombre());
		concepto=StringUtils.substring(concepto, 0, 27);
		
		AsientoContable asientoComisionDebitoAbonoIva=new AsientoContable();
		cuenta="102-0002-000";
		asientoComisionDebitoAbonoIva.setCuenta(cuenta);
		asientoComisionDebitoAbonoIva.setConcepto(concepto.replaceAll("@TIPO", "DEB"));		
		asientoComisionDebitoAbonoIva.setHaber(ivaComisionDebito);
		asientoComisionDebitoAbonoIva.setDescripcion("");
		asientoComisionDebitoAbonoIva.setDescripcion2("DEBITO");
		asientoComisionDebitoAbonoIva.setSucursal(suc.getNombre());
		asientoComisionDebitoAbonoIva.setAgrupador("B");
		asientoComisionDebitoAbonoIva.setTipo("H");
		asientoComisionDebitoAbonoIva.setOrden(18);
		poliza.agregarAsiento(asientoComisionDebitoAbonoIva);
		
		AsientoContable asientoComisionCreditoAbonoIva=new AsientoContable();
		asientoComisionCreditoAbonoIva.setCuenta(cuenta);
		asientoComisionCreditoAbonoIva.setConcepto(concepto.replaceAll("@TIPO", "CRE"));		
		asientoComisionCreditoAbonoIva.setHaber(ivaComisionCredito);
		asientoComisionCreditoAbonoIva.setDescripcion("");
		asientoComisionCreditoAbonoIva.setDescripcion2("CREDITO");
		asientoComisionCreditoAbonoIva.setSucursal(suc.getNombre());
		asientoComisionCreditoAbonoIva.setAgrupador("B");
		asientoComisionCreditoAbonoIva.setTipo("H");
		asientoComisionCreditoAbonoIva.setOrden(20);
		poliza.agregarAsiento(asientoComisionCreditoAbonoIva);
		
		
		
		AsientoContable asientoComisionCreditoAmexAbonoIva=new AsientoContable();
		asientoComisionCreditoAmexAbonoIva.setCuenta(cuenta);
		asientoComisionCreditoAmexAbonoIva.setConcepto(concepto.replaceAll("@TIPO", "AMEX"));		
		asientoComisionCreditoAmexAbonoIva.setHaber(ivaComisionCreditoAmex);
		asientoComisionCreditoAmexAbonoIva.setDescripcion("");
		asientoComisionCreditoAmexAbonoIva.setDescripcion2("AMEX");
		asientoComisionCreditoAmexAbonoIva.setSucursal(suc.getNombre());
		asientoComisionCreditoAmexAbonoIva.setAgrupador("B");
		asientoComisionCreditoAmexAbonoIva.setTipo("H");
		//asientoComisionCreditoAmexAbonoIva.setOrden(22);
		//poliza.agregarAsiento(asientoComisionCreditoAmexAbonoIva);
	}
	
	private CantidadMonetaria importeMostrador;
	private CantidadMonetaria ivaMostrador;
	
	/**
	 * 	401-0001-SUC	MOSTRADOR						X
		206-0003-001	I.V.A. EN VENTAS				X
		
	 * @param poliza
	 * @param suc
	 */
	private void registrarVentas(final Poliza poliza,final Sucursal suc){
		String hql="from Venta v where v.sucursal.id=? and v.fecha=? and v.origen=\'MOS\'";
		Object[] values=new Object[]{suc.getId(),poliza.getFecha()};
		List<Venta> ventas=ServiceLocator2.getHibernateTemplate().find(hql, values);
		importeMostrador=CantidadMonetaria.pesos(0);
		ivaMostrador=CantidadMonetaria.pesos(0);
		for(Venta v:ventas){
			if(v.getTotal().doubleValue()<=0)
				continue;
			importeMostrador=importeMostrador.add(v.getImporteCM());
			ivaMostrador=ivaMostrador.add(CantidadMonetaria.pesos(v.getImpuesto()));
			
			ComprobanteFiscal cf=ServiceLocator2.getCFDManager().cargarComprobante(v);
			
			AsientoContable a=new AsientoContable();
			String cuenta="401-0001-"+suc.getClaveContableAsString();
			a.setCuenta(cuenta);
			a.setHaber(v.getImporteCM());
			
			String concepto;
			if(cf!=null){
				String pattern="F:{0} {1,date,dd/MM/yyyy hh:mm:ss}";
				concepto=MessageFormat.format(pattern						
						,cf.getFolio()
						,cf.getLog().getCreado()
						
						);
				concepto=StringUtils.substring(concepto, 0, 27);
			}else
				concepto="ERROR NO LOCALIZO CFD";
			
			a.setConcepto(concepto);
			
			a.setSucursal(suc.getNombre());
			a.setDescripcion(suc.getNombre());
			a.setAgrupador("A");
			a.setTipo("H");
			a.setOrden(3);
			poliza.agregarAsiento(a);			
		}		
		
		
		AsientoContable ivaPendienteCamionetaAsiento=new AsientoContable();
		String cuenta="206-0003-001";
		ivaPendienteCamionetaAsiento.setCuenta(cuenta);
		ivaPendienteCamionetaAsiento.setHaber(ivaMostrador);
		String concepto="I.V.A. EN VENTAS";
		concepto=StringUtils.substring(concepto, 0, 27);
		ivaPendienteCamionetaAsiento.setConcepto(concepto);		
		ivaPendienteCamionetaAsiento.setSucursal(suc.getNombre());
		ivaPendienteCamionetaAsiento.setAgrupador("A");
		ivaPendienteCamionetaAsiento.setOrden(4);
		poliza.agregarAsiento(ivaPendienteCamionetaAsiento);
	}
	
	/**
	 * Para complementar el excedente en los pagos con tarjeta
	 * 
	 */
	private void registrarVentasCamioneta(final Poliza poliza,final Sucursal suc){
		List<Aplicacion> aplicacionesTarjeta=ServiceLocator2
		.getHibernateTemplate().find("from Aplicacion a where a.fecha=? and a.cargo.sucursal.id=?  and a.cargo.origen=\'CAM\'"
				,new Object[]{poliza.getFecha(),suc.getId()});
		List<PagoConTarjeta> pgTar=new UniqueList<PagoConTarjeta>(new BasicEventList<PagoConTarjeta>(),GlazedLists.beanPropertyComparator(PagoConTarjeta.class, "id"));
		for(Aplicacion ap:aplicacionesTarjeta){
			if(ap.getAbono() instanceof PagoConTarjeta){
				pgTar.add((PagoConTarjeta)ap.getAbono());
			}
		}
		CantidadMonetaria total=CantidadMonetaria.pesos(0);
		for(PagoConTarjeta pago:pgTar){
			total=total.add(pago.getTotalCM());
		}
		AsientoContable a=new AsientoContable();
		String cuenta="105-"+suc.getClaveContableAsString()+"-000";
		a.setCuenta(cuenta);
		a.setHaber(total);
		
		String concepto="PAGO TARJETA CAMIONETA";
		concepto=StringUtils.substring(concepto, 0, 27);
		a.setConcepto(concepto);
		a.setSucursal(suc.getNombre());
		a.setDescripcion(suc.getNombre());
		a.setAgrupador("A");
		a.setTipo("H");
		a.setOrden(7);
		poliza.agregarAsiento(a);
		
		//Registramso el IETU de los cobros de Tarjeta Camioneta
		
		CantidadMonetaria importe=MonedasUtils.calcularImporteDelTotal(total);
		
		AsientoContable cargoIETUCAM=new AsientoContable();
		cargoIETUCAM.setConcepto("IETU ACUMULABLE (CAM)");
		cargoIETUCAM.setCuenta("902-0002-000");
		cargoIETUCAM.setDebe(importe);		
		cargoIETUCAM.setAgrupador("X");
		cargoIETUCAM.setTipo("D");
		cargoIETUCAM.setOrden(8);
		poliza.agregarAsiento(cargoIETUCAM);
		
		AsientoContable abonoIETUCAM=new AsientoContable();
		abonoIETUCAM.setConcepto("IETU ACUMULABLE (CAM)");
		abonoIETUCAM.setCuenta("903-0002-000");
		abonoIETUCAM.setHaber(importe);
		abonoIETUCAM.setAgrupador("X");
		abonoIETUCAM.setTipo("H");
		abonoIETUCAM.setOrden(9);		
		poliza.agregarAsiento(abonoIETUCAM);
		
		//IVA de este  IETU
		CantidadMonetaria iva=MonedasUtils.calcularImpuesto(importe);
		AsientoContable ivaVentasIETUCAM=new AsientoContable();
		cuenta="206-0004-001";
		ivaVentasIETUCAM.setCuenta(cuenta);
		concepto="I.V.A. EN VENTAS Tar CAM";
		concepto=StringUtils.substring(concepto, 0, 27);
		ivaVentasIETUCAM.setConcepto(concepto);
		ivaVentasIETUCAM.setDebe(iva);
		ivaVentasIETUCAM.setSucursal(suc.getNombre());
		ivaVentasIETUCAM.setAgrupador("X");
		ivaVentasIETUCAM.setTipo("D");
		ivaVentasIETUCAM.setOrden(10);
		poliza.agregarAsiento(ivaVentasIETUCAM);
		
		AsientoContable abonoIVA_IETU_CAM=new AsientoContable();
		cuenta="206-0003-001";
		abonoIVA_IETU_CAM.setCuenta(cuenta);
		concepto="I.V.A. EN VENTAS Tar CAM";
		concepto=StringUtils.substring(concepto, 0, 27);
		abonoIVA_IETU_CAM.setConcepto(concepto);
		abonoIVA_IETU_CAM.setHaber(iva);
		abonoIVA_IETU_CAM.setSucursal(suc.getNombre());
		abonoIVA_IETU_CAM.setAgrupador("X");
		abonoIVA_IETU_CAM.setTipo("H");
		abonoIVA_IETU_CAM.setOrden(11);
		poliza.agregarAsiento(abonoIVA_IETU_CAM);
	
	}	
	
	
	
	/**
	 * 	902-0001-000	ACUMULABLE IETU MOS		X	
		903-0001-000	ACUMULABLE IETU MOS				X
	 * @param poliza
	 * @param suc
	 */
	private void registrarIETU(final Poliza poliza, final Sucursal suc){
		AsientoContable a1=new AsientoContable();
		a1.setConcepto("ACUMULABLE IETU (MOS)");
		a1.setCuenta("902-0001-000");
		
		AsientoContable a2=new AsientoContable();
		a2.setConcepto("IETU ACUMULABLE (MOS)");
		a2.setCuenta("903-0001-000");
		
		
		
		a1.setDebe(importeMostrador);
		a1.setAgrupador("X");
		a1.setOrden(5);
		a2.setHaber(importeMostrador);
		a2.setAgrupador("X");
		a2.setOrden(6);
		
		poliza.getRegistros().add(a1);
		poliza.getRegistros().add(a2);
	}
	
	/**
	 *  704-0001-000	OTROS GASTOS MOS		X	
		702-0001-000	OTROS INGRESOS MOS				X
	 * @param poliza
	 * @param suc
	 */
	private void registrarOtrosIngresosGastos(final Poliza poliza,final Sucursal suc){
		
		//Otros ingresos
		CantidadMonetaria otrosIngresos=CantidadMonetaria.pesos(0);
		for(Pago pago:pagos){
			CantidadMonetaria diferencia=new CantidadMonetaria(pago.getDiferencia(),pago.getMoneda());
			otrosIngresos=otrosIngresos.add(diferencia);
		}
		
		//Otros gastos
		CantidadMonetaria otrosGastos=CantidadMonetaria.pesos(0);
		for(Pago pago:pagos){
			if(pago instanceof PagoDeDiferencias){
				otrosGastos=otrosGastos.add(pago.getTotalCM());
			}
		}
		
		CantidadMonetaria otros=otrosIngresos.subtract(otrosGastos);
		
		AsientoContable registro1=new AsientoContable();
		registro1.setAgrupador("O");
		registro1.setDescripcion("");
		registro1.setCuenta("702-0001-000");
		registro1.setConcepto("OTROS INGRESOS MOS");
		registro1.setHaber(otros);
		registro1.setOrden(25);
		poliza.getRegistros().add(registro1);
		
		AsientoContable registro2=new AsientoContable();
		registro2.setDescripcion("");
		registro2.setAgrupador("O");
		registro2.setCuenta("704-0001-000");
		registro2.setConcepto("OTROS GASTOS MOS");
		registro2.setDebe(otros);
		registro2.setOrden(26);
		poliza.getRegistros().add(registro2);
		
		
	}

}
